/**
 * object.create(proto, propertiesObject)
 object.create() 是使用指定的原型proto对象及其属性propertiesObject去创建一个新的对象。(mdn)


 proto 是必填参数，就是新创建出来的对象的原型 （新对象的 __proto__属性指向的对象），
 值得注意的是当proto为null的时候创建的新对象完全是一个空对象，没有原型,
 也就是没有继承Object.prototype上的方法。（如hasOwnProperty() toString() 等）



 */


// 可以通过Object.create(null) 创建一个干净的对象，也就是没有原型
let person = Object.create(null,{
    name:{
        value:'abc'
    }
})

console.log(person.__proto__) // undefined

console.log('---------------------------------')

// 创建一个对象，其原型指向指定的对象obj
let obj = {name:'貂蝉'}
let  user = Object.create(obj,{
    // name 会成为所创建对象的数据属性
    // 省略了的属性特性默认为false,所以属性name是不可写,不可枚举,不可配置的:
    name:{
        value:'王昭君'
    },
    // 创建一个可写的,可枚举的,可配置的属性phone
    phone:{
        value: '1234567',
        writable: true,
        enumerable: true,
        configurable: true
    }
})
console.log("user.name:",user.name)
console.log(user.__proto__) // { name: '貂蝉' }
user.name = '安琪拉'
console.log("user.name:",user.name) // 王昭君
user.phone = '137...'
console.log('user.phone:',user.phone);// user.phone: 137...
for (let prop in user) {
    console.log('user只枚举到属性：',prop) // user.prop: phone
}


console.log('---------------------------------')

//以字面量方式创建的空对象就相当于:
let o  = Object.create(Object.prototype)
console.log('o:',o.__proto__) // {}


//用 Object.create实现类式继承
function Parent(pswd){
    this.pswd = pswd
    this.value = '123'
}
Parent.prototype.say = function(){
    console.log(this.pswd,this.value)
}

function Child(pswd){
    Parent.call(this,pswd)
}
Child.prototype = Object.create(Parent.prototype)
Child.prototype.constructor = Child

const child = new Child('密码')
console.log(child.pswd);
child.say() // parent say...
console.log(child.constructor); // [Function: Child]
